package com.sharer.last.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.sharer.last.base.model.PageVO;
import com.sharer.last.model.dto.comment.CommentChangeDTO;
import com.sharer.last.model.dto.comment.CommentAddDTO;
import com.sharer.last.model.dto.comment.CommentQueryDTO;
import com.sharer.last.model.po.CommentPO;
import com.sharer.last.model.vo.comment.CommentGeneralVO;
import com.sharer.last.model.vo.comment.CommentVO;


import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface CommentService extends IService<CommentPO> {
    /**
     * 统计评论数量
     *
     * @param commentType 评论类型
     * @param relevantId  博客id
     * @param isPublished 是否公开
     * @return
     */
    long countByRelevantIdAndCommentType(Integer commentType, Long relevantId, Boolean isPublished);

    /**
     * 获取指定id所有下级评论id集合（包括自己的id）
     *
     * @param id
     * @return
     */
    List<Long> getChildCommentIdsAndOwn(Long id);

    /**
     * 获取评论综合性数据
     *
     * @param queryDTO
     * @return
     */
    CommentGeneralVO getCommentByPage(CommentQueryDTO queryDTO);

    /**
     * 查询评论数据及下级评论
     *
     * @param id
     * @return
     */
    CommentVO findById(Long id);

    /**
     * 指定类型（博客文章、关于我、友链）下的所有一级评论
     *
     * @param relevantId 关联id
     * @return
     */
    List<CommentPO> queryListByRelevantId(Long relevantId);

    /**
     * 查询指定评论的所有下级评论
     *
     * @param id 评论id
     * @return
     */
    List<CommentPO> queryListById(Long id);

    /**
     * 查询指定评论的所有下级评论
     *
     * @param id 评论id
     * @return
     */
    List<CommentVO> selectListById(Long id);

    /**
     * 分页查询
     *
     * @param queryDTO 请求参数
     * @return
     */
    PageVO<CommentVO> selectListByPage(CommentQueryDTO queryDTO);

    /**
     * 新增评论
     *
     * @param comment
     */
    void createComment(CommentChangeDTO comment);

    /**
     * 前端 新增评论
     *
     * @param comment
     * @param request
     */
    void createComment(CommentAddDTO comment, HttpServletRequest request);

    /**
     * 更新评论
     *
     * @param comment 评论实体
     */
    void updateComment(CommentChangeDTO comment);

    /**
     * 更新评论公开状态
     *
     * @param commentId
     * @param published
     */
    void updateCommentPublishedById(Long commentId, Integer published);

    /**
     * 更新评论邮件提醒状态
     *
     * @param id
     * @param notice
     */
    void updateCommentNoticeById(Long id, Integer notice);

    /**
     * 删除评论
     *
     * @param id 评论id
     */
    void removeCommentById(Long id);

    /**
     * 删除指定关联id的数据
     *
     * @param relevantId 关联id
     * @return
     */
    void removeByRelevantId(Long relevantId);
}
